package main

import (
	_ "context"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

// 方式一：不带参数, 可接受所有请求方式
// func main() {
// 	s := g.Server()
// 	s.BindHandler("/hello", func(r *ghttp.Request) {
// 		r.Response.Write("Hello, world!")
// 	})
// 	s.SetPort(8080)
// 	s.Run()
// }

// 方式二：获取参数，可处理所有请求方式
func main() {
	s := g.Server()
	s.BindHandler("/hello", func(r *ghttp.Request) {
		r.Response.Writef(
            "Hello %s! Your Age is %d",
            r.Get("name", "unknown").String(),
            r.Get("age").Int(),
        )
	})
	s.SetPort(8080)
	s.Run()
}

//方式三：定义请求对象，规范请求
// type HelloReq struct {
//     Name string `json:"name"`// 名称
//     Age  int    // 年龄
// }

// func main() {
// 	s := g.Server()
// 	s.BindHandler("/hello", func(r *ghttp.Request) {
// 		req := new(HelloReq)
// 		if err := r.Parse(req); err != nil {
// 			r.Response.WriteJson(g.Map{
// 				"code": 1,
// 				"msg":  "参数错误",
// 			})
// 			return
// 		}
// 		r.Response.Writef(
// 			"Hello %s! Your Age is %d",
// 			req.Name,
// 			req.Age,
// 		)
// 	})
// 	s.SetPort(8080)
// 	s.Run()
// }

// 方式四：使用规范路由
// 1、数据结构定义
// type HelloReq struct {
// 	g.Meta `path:"/hello" method:"post"`
// 	Name string `json:"name"` // 名称
// 	Age  int    // 年龄
// }
// type HelloRes struct{}

// // 2、定义路由对象
// type HelloRouter struct {
// 	ghttp.Router
// }

// // 3、实现路由方法
// func (HelloRouter) Say(ctx context.Context, req *HelloReq) (res *HelloRes, err error) {
//     r := g.RequestFromCtx(ctx)
//     r.Response.Writef(
//         "Hello %s! Your Age is %d",
//         req.Name,
//         req.Age,
//     )
//     return
// }

// // 4、注册路由
// func main() {
// 	s := g.Server()
// 	r := new(HelloRouter)
// 	s.Group("/", func(group *ghttp.RouterGroup) {
// 		group.Bind(r)
// 	})
// 	s.SetPort(8080)
// 	s.Run()
// }


// 方式五：使用规范路由,定义多个数据结构
// 1、数据结构定义
// type HelloReq struct {
// 	g.Meta `path:"/" method:"post"`
// 	Name string `json:"name"` // 名称
// 	Age  int    // 年龄
// }
// type HelloRes struct{}

// type GoodbyeReq struct {
// 	g.Meta `path:"/goodbye" method:"get"`
// 	Name string `json:"name"` // 名称
// }
// type GoodbyeRes struct{}

// // 2、定义路由对象
// type HelloRouter struct {
// 	ghttp.Router
// }

// // 3、实现路由方法
// func (HelloRouter) Say(ctx context.Context, req *HelloReq) (res *HelloRes, err error) {
//     r := g.RequestFromCtx(ctx)
//     r.Response.Writef(
//         "Hello %s! Your Age is %d",
//         req.Name,
//         req.Age,
//     )
//     return
// }

// func (HelloRouter) Goodbye(ctx context.Context, req *GoodbyeReq) (res *GoodbyeRes, err error) {
//     r := g.RequestFromCtx(ctx)
//     r.Response.Writef(
//         "Goodbye %s!",
//         req.Name,
//     )
//     return
// }

// // 4、注册路由
// func main() {
// 	s := g.Server()
// 	r := new(HelloRouter)
// 	s.Group("/", func(group *ghttp.RouterGroup) {
// 		group.Bind(r)
// 	})
// 	s.SetPort(8080)
// 	s.Run()
// }

// 5、测试
// curl -X POST http://127.0.0.1:8080/hello -d '{"name":"john","age":25}' -H "Content-Type: application/json"

// 方式六：使用规范路由,定义多个数据结构
// 1、数据结构定义
// type HelloReq struct {
// 	g.Meta `method:"post"` // 注意⚠️⚠️⚠️，如果下面的路有对象有多个方法，且都使用该结构体，则不能添加path，否则会导致路由冲突，不添加后路径会默认设置为方法名字
// 	Name string `json:"name"` // 名称
// 	Age  int    // 年龄
// }
// type HelloRes struct{}

// // 2、定义路由对象
// type HelloRouter struct {
// 	ghttp.Router
// }

// // 3、实现路由方法
// func (HelloRouter) Say(ctx context.Context, req *HelloReq) (res *HelloRes, err error) {
//     r := g.RequestFromCtx(ctx)
//     r.Response.Writef(
//         "Hello %s! Your Age is %d",
//         req.Name,
//         req.Age,
//     )
//     return
// }

// func (HelloRouter) SayHello(ctx context.Context, req *HelloReq) (res *HelloRes, err error) {
//     r := g.RequestFromCtx(ctx)
//     r.Response.Writef(
//         "SayHello %s! Your Age is %d",
//         req.Name,
//         req.Age,
//     )
//     return
// }


// // 4、注册路由
// func main() {
// 	s := g.Server()
// 	r := new(HelloRouter)
// 	s.Group("/", func(group *ghttp.RouterGroup) {
// 		group.Bind(r)
// 	})
// 	s.SetPort(8080)
// 	s.Run()
// }


// 方式七：使用规范路由, 路由组
// 1、数据结构定义
// type HelloReq struct {
// 	g.Meta `method:"post"` // 注意⚠️⚠️⚠️，如果下面的路有对象有多个方法，且都使用该结构体，则不能添加path，否则会导致路由冲突，不添加后路径会默认设置为方法名字
// 	Name string `json:"name"` // 名称
// 	Age  int    // 年龄
// }
// type HelloRes struct{}

// // 2、定义路由对象
// type HelloRouter struct {
// 	ghttp.Router
// }

// // 3、实现路由方法
// func (HelloRouter) Say(ctx context.Context, req *HelloReq) (res *HelloRes, err error) {
//     r := g.RequestFromCtx(ctx)
//     r.Response.Writef(
//         "Hello %s! Your Age is %d",
//         req.Name,
//         req.Age,
//     )
//     return
// }

// func (HelloRouter) SayHello(ctx context.Context, req *HelloReq) (res *HelloRes, err error) {
//     r := g.RequestFromCtx(ctx)
//     r.Response.Writef(
//         "SayHello %s! Your Age is %d",
//         req.Name,
//         req.Age,
//     )
//     return
// }


// // 4、注册路由
// func main() {
// 	s := g.Server()
// 	r := new(HelloRouter)
// 	s.Group("/v1", func(group *ghttp.RouterGroup) {
// 		group.Group("/", func(group *ghttp.RouterGroup) {
// 			group.Bind(r)
// 		})
// 	})

// 	s.Group("/v2", func(group *ghttp.RouterGroup) {
// 		group.Group("/", func(group *ghttp.RouterGroup) {
// 			group.Bind(r)
// 		})
// 	})	
// 	s.SetPort(8080)
// 	s.Run()
// }